import 'package:flutter/material.dart';
import 'package:english_words/english_words.dart';

// @dart=2.9
void main() => runApp(new MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return new MaterialApp(
      title: 'Startup Name Generator',
      theme: new ThemeData(
        primaryColor: Colors.black,
      ),
      home: new RandomWords()
    );
  }
}

// 创建列表状态类
class RandomWords extends StatefulWidget {
  @override
  createState() => new RandomWordsState();
}

// 生成列表，收藏，跳转路由等
class RandomWordsState extends State<RandomWords> {
  final _suggestions = <WordPair>[]; // 申明私有数组，保存单词对列表
  final _biggerFont = new TextStyle(fontSize: 24); // 字体大小
  final _saved = new Set<WordPair>(); // 生成收藏单词对列表

  @override
  Widget build(BuildContext context) {
    // 将生成随机单词提取到当前类中
    return new Scaffold(
      appBar: new AppBar(
        title: new Text('Startup Name Generator'),
        actions: [
          new IconButton(onPressed: _pushSaved, icon: new Icon(Icons.list))
        ],
      ),
      body: _buildSuggestions()
    );
  }

  // 1. 生成单词对列表
  Widget _buildSuggestions() {
    return new ListView.builder(
      padding: const EdgeInsets.all(16),
      itemBuilder: (context, i) {
        if (i.isOdd) return new Divider();
        // 语法 "i ~/ 2" 表示i除以2，但返回值是整形（向下取整），比如i为：1, 2, 3, 4, 5
        // 时，结果为0, 1, 1, 2, 2， 这可以计算出ListView中减去分隔线后的实际单词对数量
        final index = i ~/ 2;
        // 如果是建议列表中最后一个单词对
        if (index >= _suggestions.length) {
          // ...接着再生成10个单词对，然后添加到列表
          _suggestions.addAll(generateWordPairs().take(10));
        }
        return _buildRow(_suggestions[index]);
      },
    );
  }

  // 1.1 构建每一行数据
  Widget _buildRow(WordPair pair) {
    final alreadySaved = _saved.contains(pair);
    return new ListTile(
      title: new Text(
        pair.asPascalCase,
        style: _biggerFont
      ),
      trailing: new Icon(
        // 控制颜色和样式
        alreadySaved ? Icons.favorite : Icons.favorite_border,
        color: alreadySaved ? Colors.red : null
      ),
      onTap: (){
        setState(() {
          alreadySaved ? _saved.remove(pair) : _saved.add(pair);
        });
      }, // 添加点击事件
    );
  }

  // 2. 点击跳转路由
  void _pushSaved(){
    Navigator.of(context).push(
        new MaterialPageRoute(
          builder: (context) {
            // 获取收藏列表数据
            final titles = _saved.map((pair) => new ListTile(
              title: new Text(
                pair.asPascalCase,
                style: _biggerFont,
              ),
            ));

            // 设置分割线等
            final divided = ListTile
              .divideTiles(context:context, tiles: titles)
              .toList();

            return new Scaffold(
              appBar: new AppBar(
                title: new Text('收藏列表'),
              ),
              body: new ListView(children: divided),
            );
          }
        )
    );
  }
}
